Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / pycodec2_ctypes.py

Displaying Raw • Download


meshchatx/pycodec2_ctypes.py e41daa5b65e07a5baa1aaad32d97f90482f1cd1c (e41daa5b) Text, 6.81 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""ctypes-backed pycodec2-compatible Codec2 for Android when the extension is broken.

Chaquopy vendor wheels have shipped an empty pycodec2.so (no PyInit). libcodec2.so
is valid and preloaded. This module exposes the subset of the pycodec2 API that
LXST.Codecs.Codec2 and MeshChatX probes need.
"""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787ctypes
Tff7b72import T7ee787logging
Tff7b72import T7ee787os
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path

Te6edf3logger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)

T8b949e# codec2.h mode constants (bitrate arg maps through this table)
Te6edf3_MODES Tff7b72= Tb4b4b4{
T79c0ff700Tb4b4b4: T79c0ff8Tb4b4b4, T8b949e# CODEC2_MODE_700C
T79c0ff1200Tb4b4b4: T79c0ff5Tb4b4b4,
T79c0ff1300Tb4b4b4: T79c0ff4Tb4b4b4,
T79c0ff1400Tb4b4b4: T79c0ff3Tb4b4b4,
T79c0ff1600Tb4b4b4: T79c0ff2Tb4b4b4,
T79c0ff2400Tb4b4b4: T79c0ff1Tb4b4b4,
T79c0ff3200Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}

Te6edf3_libTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffCDLL Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Te6edf3_lib_errorTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None


Tff7b72class T56d364_CODEC2Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffStructureTb4b4b4)Tb4b4b4:
Tff7b72pass


Te6edf3_CODEC2_p Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3_CODEC2Tb4b4b4)


Tff7b72def Td2a8ff_cdll_loadTb4b4b4(Te6edf3path_or_nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Te6edf3ctypesTff7b72.Td2a8ffCDLLTb4b4b4:
Te6edf3mode Tff7b72= Tffa657getattrTb4b4b4(Te6edf3ctypesTb4b4b4, Ta5d6ff"Ta5d6ffRTLD_GLOBALTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3mode Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3ctypesTff7b72.Td2a8ffCDLLTb4b4b4(Te6edf3path_or_nameTb4b4b4)
Tff7b72return Te6edf3ctypesTff7b72.Td2a8ffCDLLTb4b4b4(Te6edf3path_or_nameTb4b4b4, Te6edf3modeTff7b72=Te6edf3modeTb4b4b4)


Tff7b72def Td2a8ff_candidate_lib_pathsTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4:
Te6edf3pathsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3seenTb4b4b4: Tffa657setTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffaddTb4b4b4(Te6edf3valueTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3value Tff7b72and Te6edf3value Tff7b72not Tff7b72in Te6edf3seenTb4b4b4:
Te6edf3seenTff7b72.Td2a8ffaddTb4b4b4(Te6edf3valueTb4b4b4)
Te6edf3pathsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3valueTb4b4b4)

Te6edf3explicit Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_LIBCODEC2_PATHTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3explicitTb4b4b4:
Te6edf3addTb4b4b4(Te6edf3explicitTb4b4b4)
Te6edf3native_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_NATIVE_LIB_DIRTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3native_dirTb4b4b4:
Te6edf3addTb4b4b4(Tffa657strTb4b4b4(Te6edf3PathTb4b4b4(Te6edf3native_dirTb4b4b4) Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3entry Tff7b72in Tffa657listTb4b4b4(Tffa657__import__Tb4b4b4(Ta5d6ff"Ta5d6ffsysTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffpathTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3entryTb4b4b4:
Tff7b72continue
Te6edf3root Tff7b72= Te6edf3PathTb4b4b4(Te6edf3entryTb4b4b4)
Te6edf3addTb4b4b4(Tffa657strTb4b4b4(Te6edf3root Tff7b72/ Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff" Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3addTb4b4b4(Tffa657strTb4b4b4(Te6edf3root Tff7b72/ Ta5d6ff"Ta5d6ffchaquopyTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6fflibTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3addTb4b4b4(Tffa657strTb4b4b4(Te6edf3root Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3addTb4b4b4(Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3paths


Tff7b72def Td2a8ff_bindTb4b4b4(Te6edf3libTb4b4b4: Te6edf3ctypesTff7b72.Td2a8ffCDLLTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3libTff7b72.Td2a8ffcodec2_createTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[Te6edf3ctypesTff7b72.Td2a8ffc_intTb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_createTff7b72.Td2a8ffrestype Tff7b72= Te6edf3_CODEC2_p
Te6edf3libTff7b72.Td2a8ffcodec2_destroyTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[Te6edf3_CODEC2_pTb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_destroyTff7b72.Td2a8ffrestype Tff7b72= Tff7b72None
Te6edf3libTff7b72.Td2a8ffcodec2_encodeTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[
Te6edf3_CODEC2_pTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_uint8Tb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_shortTb4b4b4)Tb4b4b4,
Tb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_encodeTff7b72.Td2a8ffrestype Tff7b72= Tff7b72None
Te6edf3libTff7b72.Td2a8ffcodec2_decodeTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[
Te6edf3_CODEC2_pTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_shortTb4b4b4)Tb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_uint8Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_decodeTff7b72.Td2a8ffrestype Tff7b72= Tff7b72None
Te6edf3libTff7b72.Td2a8ffcodec2_samples_per_frameTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[Te6edf3_CODEC2_pTb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_samples_per_frameTff7b72.Td2a8ffrestype Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_int
Te6edf3libTff7b72.Td2a8ffcodec2_bits_per_frameTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[Te6edf3_CODEC2_pTb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_bits_per_frameTff7b72.Td2a8ffrestype Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_int
Te6edf3libTff7b72.Td2a8ffcodec2_bytes_per_frameTff7b72.Td2a8ffargtypes Tff7b72= Tb4b4b4[Te6edf3_CODEC2_pTb4b4b4]
Te6edf3libTff7b72.Td2a8ffcodec2_bytes_per_frameTff7b72.Td2a8ffrestype Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffc_int


Tff7b72def Td2a8ffload_libcodec2Tb4b4b4(Tff7b72*Tb4b4b4, Te6edf3forceTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4) Tff7b72-Tff7b72> Te6edf3ctypesTff7b72.Td2a8ffCDLLTb4b4b4:
T8b949e"""Load and bind libcodec2 for ctypes Codec2 wrappers."""
Tff7b72global Te6edf3_libTb4b4b4, Te6edf3_lib_error
Tff7b72if Te6edf3_lib Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72not Te6edf3forceTb4b4b4:
Tff7b72return Te6edf3_lib
Te6edf3last_errorTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72for Te6edf3candidate Tff7b72in Te6edf3_candidate_lib_pathsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3candidate Tff7b72!= Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff" Tff7b72and Tff7b72not Te6edf3PathTb4b4b4(Te6edf3candidateTb4b4b4)Tff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3lib Tff7b72= Te6edf3_cdll_loadTb4b4b4(Te6edf3candidateTb4b4b4)
Te6edf3_bindTb4b4b4(Te6edf3libTb4b4b4)
T8b949e# Touch create/destroy so we fail early on a stub library.
Te6edf3state Tff7b72= Te6edf3libTff7b72.Td2a8ffcodec2_createTb4b4b4(Te6edf3_MODESTb4b4b4[T79c0ff1600Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3stateTb4b4b4:
Tff7b72raise Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffcodec2_create returned NULLTa5d6ff"Tb4b4b4)
Te6edf3libTff7b72.Td2a8ffcodec2_destroyTb4b4b4(Te6edf3stateTb4b4b4)
Te6edf3_lib Tff7b72= Te6edf3lib
Te6edf3_lib_error Tff7b72= Tff7b72None
Te6edf3loggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2_ctypes loaded libcodec2 from Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3candidateTb4b4b4)
Tff7b72return Te6edf3lib
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3last_error Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3candidateTffd700}Ta5d6ff: Tffd700{Te6edf3excTffd700}Ta5d6ff"
Te6edf3_lib Tff7b72= Tff7b72None
Te6edf3_lib_error Tff7b72= Te6edf3last_error Tff7b72or Ta5d6ff"Ta5d6fflibcodec2.so not foundTa5d6ff"
Tff7b72raise Tf85149OSErrorTb4b4b4(Te6edf3_lib_errorTb4b4b4)


Tff7b72def Td2a8fflibcodec2_load_errorTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_lib_error


Tff7b72class T56d364Codec2Tb4b4b4:
T8b949e"""Minimal pycodec2.Codec2 stand-in used by LXST."""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3modeTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3mode Tff7b72not Tff7b72in Te6edf3_MODESTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnsupported Codec2 mode: Tffd700{Te6edf3modeTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3lib Tff7b72= Te6edf3load_libcodec2Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_lib Tff7b72= Te6edf3lib
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Te6edf3libTff7b72.Td2a8ffcodec2_createTb4b4b4(Te6edf3_MODESTb4b4b4[Te6edf3modeTb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4:
Tff7b72raise Tf85149MemoryErrorTb4b4b4(Ta5d6ff"Ta5d6ffcodec2_create failedTa5d6ff"Tb4b4b4)

Tff7b72def Tff7b72__del__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3state Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_stateTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3lib Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_libTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3state Tff7b72and Te6edf3lib Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3libTff7b72.Td2a8ffcodec2_destroyTb4b4b4(Te6edf3stateTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Tff7b72None

Tff7b72def Td2a8ffsamples_per_frameTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_libTff7b72.Td2a8ffcodec2_samples_per_frameTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffbits_per_frameTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_libTff7b72.Td2a8ffcodec2_bits_per_frameTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffbytes_per_frameTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_libTff7b72.Td2a8ffcodec2_bytes_per_frameTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffencodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3speech_inTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787numpy Tff7b72as T7ee787np

Te6edf3samples Tff7b72= Te6edf3npTff7b72.Td2a8ffascontiguousarrayTb4b4b4(Te6edf3speech_inTb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Te6edf3spf Tff7b72= Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3samplesTff7b72.Td2a8ffsize Tff7b72== T79c0ff0 Tff7b72or Te6edf3samplesTff7b72.Td2a8ffsize Tff7b72% Te6edf3spf Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149AssertionErrorTb4b4b4(
Ta5d6ff"Ta5d6ffencode input length must be a multiple of samples_per_frameTa5d6ff"
Tb4b4b4)
Te6edf3frames Tff7b72= Te6edf3samplesTff7b72.Td2a8ffsize Tff7b72/Tff7b72/ Te6edf3spf
Te6edf3bpf Tff7b72= Tff7b72selfTff7b72.Td2a8ffbytes_per_frameTb4b4b4(Tb4b4b4)
Te6edf3out Tff7b72= Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_uint8 Tff7b72* Tb4b4b4(Te6edf3frames Tff7b72* Te6edf3bpfTb4b4b4)Tb4b4b4)Tb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3index Tff7b72in Tffa657rangeTb4b4b4(Te6edf3framesTb4b4b4)Tb4b4b4:
Te6edf3frame_speech Tff7b72= Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_short Tff7b72* Te6edf3spfTb4b4b4)Tff7b72.Td2a8fffrom_bufferTb4b4b4(Te6edf3samplesTb4b4b4, Te6edf3index Tff7b72* Te6edf3spf Tff7b72* T79c0ff2Tb4b4b4)
Te6edf3frame_bits Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(
Te6edf3ctypesTff7b72.Td2a8ffaddressofTb4b4b4(Te6edf3outTb4b4b4) Tff7b72+ Te6edf3index Tff7b72* Te6edf3bpfTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_uint8Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_libTff7b72.Td2a8ffcodec2_encodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4, Te6edf3frame_bitsTb4b4b4, Te6edf3frame_speechTb4b4b4)
Tff7b72return Tffa657bytesTb4b4b4(Te6edf3outTb4b4b4)

Tff7b72def Td2a8ffdecodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3framesTb4b4b4: Tffa657bytesTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787numpy Tff7b72as T7ee787np

Te6edf3raw Tff7b72= Tffa657bytesTb4b4b4(Te6edf3framesTb4b4b4)
Te6edf3bpf Tff7b72= Tff7b72selfTff7b72.Td2a8ffbytes_per_frameTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4) Tff7b72< Te6edf3bpfTb4b4b4:
Tff7b72raise Tf85149AssertionErrorTb4b4b4(Ta5d6ff"Ta5d6ffdecode input shorter than bytes_per_frameTa5d6ff"Tb4b4b4)
Te6edf3frame_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3rawTb4b4b4) Tff7b72/Tff7b72/ Te6edf3bpf
Te6edf3spf Tff7b72= Tff7b72selfTff7b72.Td2a8ffsamples_per_frameTb4b4b4(Tb4b4b4)
Te6edf3speech Tff7b72= Te6edf3npTff7b72.Td2a8ffemptyTb4b4b4(Te6edf3frame_count Tff7b72* Te6edf3spfTb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Tff7b72for Te6edf3index Tff7b72in Tffa657rangeTb4b4b4(Te6edf3frame_countTb4b4b4)Tb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3rawTb4b4b4[Te6edf3index Tff7b72* Te6edf3bpf Tb4b4b4: Tb4b4b4(Te6edf3index Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* Te6edf3bpfTb4b4b4]
Te6edf3bit_buf Tff7b72= Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_uint8 Tff7b72* Te6edf3bpfTb4b4b4)Tff7b72.Td2a8fffrom_buffer_copyTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3frame_speech Tff7b72= Tb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_short Tff7b72* Te6edf3spfTb4b4b4)Tff7b72.Td2a8fffrom_bufferTb4b4b4(Te6edf3speechTb4b4b4, Te6edf3index Tff7b72* Te6edf3spf Tff7b72* T79c0ff2Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_libTff7b72.Td2a8ffcodec2_decodeTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4,
Te6edf3frame_speechTb4b4b4,
Te6edf3ctypesTff7b72.Td2a8ffcastTb4b4b4(Te6edf3bit_bufTb4b4b4, Te6edf3ctypesTff7b72.Td2a8ffPOINTERTb4b4b4(Te6edf3ctypesTff7b72.Td2a8ffc_uint8Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3speech


Tff7b72def Td2a8ffprobeTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657boolTb4b4b4, Tffa657str Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
T8b949e"""Return whether ctypes Codec2 can construct and report frame sizes."""
Tff7b72tryTb4b4b4:
Te6edf3c2 Tff7b72= Te6edf3Codec2Tb4b4b4(T79c0ff1600Tb4b4b4)
Te6edf3_ Tff7b72= Te6edf3c2Tff7b72.Td2a8ffsamples_per_frameTb4b4b4(Tb4b4b4)
Te6edf3_ Tff7b72= Te6edf3c2Tff7b72.Td2a8ffbytes_per_frameTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72TrueTb4b4b4, Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Tffa657strTb4b4b4(Te6edf3excTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────